package p11_aop之jdk和cglib代理;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * spring的aop实现原理之一是动态代理
 * 本节介绍cglib动态代理，这方式生成的代理类是目标的子类，不必有接口并且目标类必须可以被继承(不能是final)
 */
public class _2_CglibProxy {
    public static void main(String[] args) {
        /**
         * 与jdk代理不同，该种方式生成的代理对象属于目标类的子类，故而不需要接口
         * Enhancer类的create方法需要两个参数
         *  1.目标类 2.回调函数
         * 回调函数需要4个接口：
         *  1.代理类本身，方法对象，参数，methodProxy方法代理对象
         * 除了原生的反射调用目标类方法，还可以使用methodProxy来调用，这种方式不走反射，效率高
         */
        Target t = new Target();
        Target proxy = (Target)Enhancer.create(Target.class, (MethodInterceptor) (p, method, arg, methodProxy) -> {
            System.out.println("before...");

            //通过反射调用
            method.invoke(t, arg);
            //methodProxy方法调用
            methodProxy.invoke(t, arg);
            //methodProxy方法调用，不需要额外定义一个目标类对象，使用代理类对象本身即可
            methodProxy.invokeSuper(p, arg);

            System.out.println("after...");
            return null;
        });

        proxy.test();
    }
}
